package com.es.controller;

import com.es.pojo.EsEntity;
import com.es.pojo.ReindexReq;
import com.es.service.EsService;
import com.es.util.Result;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * @ClassName EsController
 * @author: maliang
 * @Description 接收层
 * @date 2021/11/26 17:39
 * @Version 1.0版本
 */
@RestController
public class EsController {

    @Resource
    private EsService esService;

    /**
     * 创建索引
     *
     * @param esEntity 搜索信息
     *                 String index
     *                 List<Property> field
     * @return 是否成功
     */
    @PostMapping("createIndex")
    public Result createIndex(@RequestBody EsEntity esEntity) {
        boolean createIndexResponse = esService.createIndex(esEntity);
        return Result.success(createIndexResponse);
    }

    /**
     * 删除索引
     *
     * @param index 索引名称
     * @return 是否成功
     */
    @DeleteMapping("deleteIndex/{index}")
    public Result deleteIndex(@PathVariable String index) {
        return Result.success(esService.deleteIndex(index));
    }

    /**
     * 根据id删除数据
     *
     * @param index 索引名称
     * @param id    数据id
     * @return 是否成功
     */
    @DeleteMapping("deleteData/{index}/{id}")
    public Result deleteData(@PathVariable String index, @PathVariable String id) {
        return Result.success(esService.deleteData(index, id));
    }

    /**
     * 分析索引是否存在
     *
     * @param index 索引名称
     * @return 是否成功
     */
    @GetMapping("exists/{index}")
    public Result exists(@PathVariable String index) {
        return Result.success(esService.exists(index));
    }

    /**
     * 分析数据是否存在
     *
     * @param index 索引名称
     * @param id    数据id
     * @return 是否成功
     */
    @GetMapping("exists/{index}/{id}")
    public Result exists(@PathVariable String index, @PathVariable String id) {
        return Result.success(esService.exists(index, id));
    }

    /**
     * 添加数据
     *
     * @param esEntity String index 索引名称
     *                 String entity json字符串
     * @return 是否成功
     */
    @PostMapping("addData")
    public Result addData(@RequestBody EsEntity esEntity) {
        return Result.success(esService.addData(esEntity));
    }

    /**
     * 根据id查找数据
     *
     * @param index 索引名称
     * @param id    数据id
     * @return 数据的json字符串
     */
    @GetMapping("getStrById/{index}/{id}")
    public Result getStrById(@PathVariable String index, @PathVariable String id) {
        return Result.success(esService.getStrById(index, id));
    }

    /**
     * 根据id查找数据
     *
     * @param index 索引名称
     * @param id    数据id
     * @return 数据的json结构数据
     */
    @GetMapping("getMapById/{index}/{id}")
    public Result getMapById(@PathVariable String index, @PathVariable String id) {
        return Result.success(esService.getMapById(index, id));
    }

    /**
     * 查找索引全部数据
     *
     * @param index 索引名称
     * @param from  起始数据索引
     * @param size  显示条数
     * @return 数据列表
     */
    @GetMapping("findAll/{index}/{from}/{size}")
    public Result findAll(@PathVariable String index, @PathVariable Integer from, @PathVariable Integer size) {
        return Result.success(esService.findAll(index, from, size));
    }

    /**
     * 根据id更新数据
     *
     * @param esEntity 更新数据
     *                 String index 索引名称
     *                 String id 数据id
     *                 String entity 更新后的数据
     * @return 是否成功
     */
    @PutMapping("updateById")
    public Result updateById(@RequestBody EsEntity esEntity) {
        return Result.success(esService.updateById(esEntity));
    }

    /**
     * 根据条件查找数据(单一条件)
     *
     * @param esEntity 搜索条件
     *                 String index 索引名称
     *                 Map<String, String> criteria 搜索条件
     * @return 数据列表
     */
    @PostMapping("searchBySingleCondition")
    public Result searchBySingleCondition(@RequestBody EsEntity esEntity) {
        return Result.success(esService.searchBySingleCondition(esEntity));
    }

    /**
     * 根据条件查找数据（多条件）
     *
     * @param esEntity 搜索条件
     *                 String index 索引名称
     *                 Map<String, String> criteria 搜索条件
     * @return 数据列表
     */
    @PostMapping("searchByCriteria")
    public Result searchByCriteria(@RequestBody EsEntity esEntity) {
        return Result.success(esService.searchByCriteria(esEntity));
    }

    /**
     * 批量插入数据
     *
     * @param esEntity 批量插入的数据
     *                 String index 索引名称
     *                 List<String> entitys 插入数据的json字符串
     * @return 是否成功
     */
    @PostMapping("insertList")
    public Result insertList(@RequestBody EsEntity esEntity) {
        return Result.success(esService.insertList(esEntity));
    }

    /**
     * copy数据从指定索引到目标索引
     *
     * @param reindexReq 数据索引来源 数据索引去向
     * @return 是否成功
     */
    @PostMapping("transferData")
    public Result transferData(@RequestBody ReindexReq reindexReq) {
        return Result.success(esService.transferData(reindexReq));
    }

    /**
     * 复制数据从指定索引到目标索引并且删除原索引
     *
     * @param reindexReq 数据索引来源 数据索引去向
     * @return 是否成功
     */
    @PostMapping("transferDataDelFrom/{from}/{to}")
    public Result transferDataAndDelFrom(@RequestBody ReindexReq reindexReq) {
        return Result.success(esService.transferDataAndDelFrom(reindexReq));
    }

}